package ar.edu.uba.fi.jmit.sender;

import java.util.Comparator;

import ar.edu.uba.fi.jmit.integrationcommons.Event;
import ar.edu.uba.fi.jmit.integrationcommons.Header;
import ar.edu.uba.fi.jmit.integrationcommons.Message;

/**
 * Compara dos mensajes por todos sus campos y por el contenido del body.
 * @author Tomas
 *
 */
public class MessageDataComparator implements Comparator<Message>{

	/**
	 * Utilizado unicamente para tests.
	 * Devuelve 0 si ambos mensajes contienen exactamente la misma informacion
	 * Devuelve 1 si alguno de los dos mensajes es null y el otro no
	 * Devuelve 2 si hay alguna diferencia en el header
	 * Devuelve 3 si hay alguna diferencia en el body
	 */
	@Override
	public int compare(Message message1, Message message2) {
		if(message1 == null) {
			if(message2 == null) {
				return 0;
			}
			return 1;
		}
		if(!equalHeader(message1.getHeader(), message2.getHeader())) {
			return 2;
		}
		if(!equalBody(message1.getBody(), message2.getBody())) {
			return 3;
		}
		return 0;
	}

	private boolean equalBody(Event body1, Event body2) {
		if(body1 == null) {
			if(body2 == null) {
				return true;
			}
			return false;
		}
		if(!equalsNullSafe(body1.getSource(), body2.getSource())) {
			return false;
		}
		if(!equalsNullSafe(body1.getPriority(), body2.getPriority())) {
			return false;
		}
		if(!equalsNullSafe(body1.getData(), body2.getData())) {
			return false;
		}
		return true;
	}

	private boolean equalHeader(Header header1, Header header2) {
		if(header1 == null) {
			if(header2 == null) {
				return true;
			}
			return false;
		}
		if(!equalsNullSafe(header1.getDestinationName(), header2.getDestinationName())) {
			return false;
		}
		if(!equalsNullSafe(header1.getId(), header2.getId())) {
			return false;
		}
		if(!equalsNullSafe(header1.getCreationDate(), header2.getCreationDate())) {
			return false;
		}
		if(!equalsNullSafe(header1.getPriority(), header2.getPriority())) {
			return false;
		}
		if(!equalsNullSafe(header1.getSourceApp(), header2.getSourceApp())) {
			return false;
		}
		return true;
	}
	
	private boolean equalsNullSafe(Object object1, Object object2) {
		if(object1 == null) {
			if(object2 == null) {
				return true;
			}
			return false;
		}
		if(object1.equals(object2)) {
			return true;
		}
		return false;
	}

}
